我不確定如何真正地把我的問題變成單詞,所以讓我嘗試用一個例子來解釋一下: 假設我的程序在執行特定操作時遇到一些奇怪的行為。我已經找到了一些導致這種奇怪行為的代碼。禁用此序列時,我不會遇到此行為。不幸的是,我需要這段代碼,因為那時其他功能無法正常工作。 因此,我接下來要做的就是弄清楚為什麼在該代碼摘錄處於活動狀態時某些東西會有所不同。 為了更好地了解發生了什麼,我有時想運行包括“錯誤代碼”在內的整個動作,有時甚至沒有。然後,我可以比較結果,例如UI中發生的情況或函數返回的結果。 我想到的第一種方法是在啟用代碼的情況下運行程序,執行所需的操作,然後停止程序,註釋掉代碼,重新編譯並再次運行。嗯...聽起來很蠢。特別是如果我再次需要打開該代碼以再次查看其他行為,然後再次將其關閉,然後再打開,再關閉等等。 對我來說,使用斷點並影響語句順序或修改值是不可行的,這樣我就可以運行或不運行if語句,for循環等。兩個示例: 我調試了時序關鍵行為,並且在我暫停程序時,時序發生了顯著變化。因此,我可以設置的第一個斷點必須在操作結束時。 1個 我希望將焦點放在VS時會出現“被抑制”的工具提示或其他窗口。因此,我根本不能使用任何斷點。無論是在行動的開始還是結束都沒有。1 Visual Studio 2012中是否有任何技術可以讓我將此代碼標記為可選代碼,並且可以在執行操作之前決定是否要運行此代碼序列?我在更高層次上想到了類似if(true | false)的東西。 我不是在尋找需要重新運行程序幾次的解決方案。在那種情況下,我仍然可以使用簡單的方法,即使用#if false註釋掉代碼。 1請注意,當我需要在特定位置查看特定變量時(如果尚未將值寫入輸出),我當然可以設置斷點,但是會再次關閉斷點以一次執行整個操作走。
2020-12-07 23:08:19
在Visual Studio調試器中,您可以在“相關代碼”的前面設置一個斷點。當代碼在該位置停止時,您可以選擇繼續執行,也可以右鍵單擊任何其他行,然後選擇“設置下一條語句”。 這是一個很奇怪的選擇,但是我開始欣賞它。 | 我能想到的唯一選擇是在UI中添加僅在調試時顯示的內容,從而為您提供包括/排除相關操作的選項。 在使用它時,您可能還希望通過UI將應用程序重置為“已知狀態”。 | 我在更高層次上想到了類似if(true | false)的東西。 為什麼要“更高層次”?為什麼不使用這個呢? 您希望有時執行一段代碼,有時不執行,並且應該在運行時而不是在編譯時更改開關-這顯然導致 如果(條件) { //相關代碼 } 這裡要注意的是您將使用哪種條件-可能是在代碼的發行版本中將其設置為true的變量,有時在調試版本中將其設置為false的變量。可能是從配置文件中獲取值,也可能是從環境變量中獲取值,可能是由程序中的某種邏輯計算出來的,無論何時何地。 編輯:您還可以在條件代碼中引入一個布爾變量,默認情況下將其初始化為true,並在需要時使用調試器更改其值。 | 預處理程序指令可能就是您所追求的。它們是供編譯器執行的部分代碼,可以通過以#字符開頭來識別(從風格上講,默認情況下,它們不遵循代碼的縮進模式,而是始終牢固地位於編輯器的左側): #定義INCLUDE_DODGY_CODE 公共無效MyMethodWithDodgyBits(){ #if INCLUDE_DODGY_CODE myDodgyMethod(); #萬一 myOkMethod(); } 在這種情況下,如果包含#define INCLUDE_DODGY_CODE,則myDodgyMethod()調用將被編譯到您的程序中。否則,該調用將被編譯器跳過,並且根本不會存在於您的二進製文件中。 | 您可以根據需要提供幾個調試選項。 Visual Studio有許多選項可直接瀏覽代碼。您可以使用“設置下一條語句”功能直接移至特定語句。您還可以通過“即時窗口”,“快速監視”和在調試時將鼠標懸停在變量上的工具提示直接編輯值。 Visual Studio還具有回放執行歷史記錄的功能。看一下IntelliTrace入門。當您有多個關注的領域正在相互作用並產生錯誤情況時,這將很有幫助。 您還可以將代碼段包裝在條件塊中,並適當地設置條件變量。可能是在調試時,也可能是通過配置文件傳遞參數。如果要排除許多語句,使用條件檢查可能比手動單步執行代碼更容易。 | 有時取決於VS的版本和語言,但是您可以愉快地編輯代碼(將其註釋掉,或將其包裝在大的#ifdef 0中),然後按alt + F10鍵,編譯器將重新編譯,重新鏈接並繼續執行好像您永遠都不會擺弄它。 但是,儘管在VC ++中效果很好(自VS v6 IIRC起),但C#可能會出現問題-我發現(對於VS2010)我無法編輯並繼續使用包含任何lambda(主要是linq)語句和64位代碼的函數從來沒有這樣做過。仍然值得嘗試,因為有時它確實有用。 | 我處理的應用程序具有僅用於調試的可選代碼,這些代碼不應出現在生產環境中。這段可選代碼對我們來說最容易使用配置文件進行控制,因為它不需要重新編譯即可更改。 這樣的修復可能並不能最終解決您的最終結果,但是在找到修復程序之前,它可能有助於解決問題。如果您有多個需要組合測試的可選部分,則此修復方式可能需要在配置文件中使用多個鍵,這可能是一個缺點,而且很難跟踪。 | 您的問題並不十分清楚,這可能就是為什麼您認為無效答案如此之多的原因。如果似乎沒有人能夠回答這個問題,您可能需要考慮改寫它。 冒著給出另一個無效答案的風險,我將添加一些有關過去如何處理該問題的信息。 最簡單的方法是在其中放置任何可選代碼 #if調試 //這裡是可選代碼 #萬一 這樣,當您在調試模式下運行時,代碼便已實現,而在發布模式下則未實現。在兩者之間切換需要單擊一個按鈕。 我還通過一個簡單的標誌以類似的方式解決了相同的問題: bool runOptionalCode = false; 然後 如果(runOptionalCode) { //在此處放置可選代碼 } 再次,在模式之間切換需要更改一個單詞,因此是一項簡單的任務。您在問題中提到了這一點,但由於不清楚的原因而將其打折。正如我所說,在兩者之間切換幾乎不需要付出任何努力。 如果您需要在運行時在代碼之間進行更改,最好的方法是使用UI項或擊鍵來修改上面示例中提到的標誌。但是,根據您的應用程序,這可能會花費更多的精力。在過去,我發現當我已經將鍵偵聽器作為項目的一部分實現時,有幾個鍵可以決定是否運行調試(可選)代碼效果最佳。在沒有關鍵偵聽器的應用程序中,我寧願使用以前的方法之一。 | 你的答案 StackExchange.ifUsing(“ editor”,function(){ StackExchange.using(“ externalEditor”,function(){ StackExchange.using(“ snippets”,function(){ StackExchange.snippets.init(); }); }); },“代碼段”); StackExchange.ready(function(){ var channelOptions = { 標籤:“” .split(“”), id:“ 1” }; initTagRenderer(“”。split(“”),“” .split(“”),channelOptions); StackExchange.using(“ externalEditor”,function(){ //如果啟用了摘要,則必須在摘要後觸發編輯器 如果(StackExchange.settings.snippets.snippetsEnabled){ StackExchange.using(“ snippets”,function(){ createEditor(); }); } 其他{ createEditor(); } }); 函數createEditor(){ StackExchange.prepareEditor({ useStacksEditor:否, heartbeatType:“答案”, autoActivateHeartbeat:否, convertImagesToLinks:是, noModals:是的, showLowRepImageUploadWarning:是的, 聲望:ToPostImages:10, bindNavPrevention:是的, 後綴:“”, imageUploader:{ brandingHtml:“採用\ u003ca href = \“ https://imgur.com/ \” \ u003e \ u003csvg class = \“ svg-icon \” width = \“ 50 \” height = \“ 18 \” viewBox = \“ 0 0 50 18 \” fill = \“ none \” xmlns = \“ http://www.w3.org/2000/svg \” \ u003e \ u003cpath d = \“ M46.1709 9.17788C46.1709 8.26454 46.2665 7.94324 47.1084 7.58816C47.4091 7.46349 47.7169 7.36433 48.0099 7.26993C48.9099 6.97997 49.672 6.73443 49.672 5.93063C49.672 5.22043 48.9832 4.61182 48.1414 4.61182C47.4335 4.61182 46.7256 4.91628 46.0943 5.50789C45.74.3 4.313.6662 4.313.6662 43.1481 6.59048V11.9512C43.1481 13.2535 43.6264 13.8962 44.6595 13.8962C45.6924 13.8962 46.1709 13.2535 46.1709 11.9512V9.17788Z \“ / \ u003e \ u003cpath d = \” M32.492 10.1419C32.492 12.6954 34.1182 14.048437.0451 14.0484 41.5985 12.6954 41.5985 10.1419V6.59049C41.5985 5.28821 41.1394 4.66232 40.1061 4.66232C39.0732 4.66232 38.5948 5.28821 38.5948 6.59049V9.60062C38.5948 10.8521 38.2696 11.5455 37.0451 11.5455C35.8209 11.5455 35.4954 10.8 521 35.4954 9.60062V6.59049C35.4954 5.28821 35.0173 4.66232 34.0034 4.66232C32.9703 4.66232 32.492 5.28821 32.492 6.59049V10.1419Z \“ / \ u003e \ u003cpath fill-rule = \” evenodd \“ clip-rule = \” evenodd \“ d = \“ M25.6622 17.6335C27.8049 17.6335 29.3739 16.9402 30.2537 15.6379C30.8468 14.7755 30.9615 13.5579 30.9615 11.9512V6.59049C30.9615 5.28821 30.4833 4.66231 29.4502 4.66231C28.9913 4.66231 28.4555 4.94978 28.1109 5.50789C6.72.3 4.56087 .1369 4.56087 21.0134 6.57349 21.0134 9.27932C21.0134 11.9852 23.003 13.913 25.3754 13.913C26.5612 13.913 27.4607 13.4902 28.1109 12.6616C28.1109 12.7229 28.1161 12.7799 28.121 12.8346C28.1256 12.8854 28.1301 12.9342 28.1301 12.983C28.14.8349 15.2321 24.1352 14.9821 23.5661 14.7787C23.176 14.6393 22.8472 14.5218 22.5437 14.5218C21.7977 14.5218 21.2429 15.0123 21.2429 15.6887C21.2429 16.7375 22.9072 17.6335 25.6622 17.6335ZM24.1317 9.27932C24.1317 7.94324 24.9928 7.09766 26.1024 27.2119 7.09766 28.0918 7.94324 28.0918 9.27932C28.0918 10.6321 27.2311 11.5116 26.1024 11.5116C24.9737 11.5116 24.1317 10.6491 24.1317 9.27932Z \“ / \ u003e \ u003cpath d = \” M16.8045 11.9512C16.8045 13.2535 17.2637 13.89629.31965 19.8079 13.2535 19.8079 11.9512V8.12928C19.8079 5.82936 18.4879 4.62866 16.4027 4.62866C15.1594 4.62866 14.279 4.98375 13.3609 5.88013C12.653 5.05154 11.6581 4.62866 10.3573 4.62866C9.34336 4.62866 8.57809 4.89931 7.9466 5.5079C7.510506203 4。 5.00066 5.28821 5.00066 6.59049V11.9512C5.00066 13.2535 5.47873 13.8962 6.51203 13.8962C7.54479 13.8962 8.0232 13.2535 8.0232 11.9512V8.90741C8.0232 7.58817 8.44431 6.91179 9.53458 6.91179C10.5104 6.91179 10.893 7.58817 10.893 8.9410811.93.8962 C13.4375 13.8962 13.9157 13.2535 13.9157 11.9512V8.90741C13.9157 7.58817 14.3365 6.91179 15.4269 6.91179C16.4027 6.91179 16.8045 7.58817 16.8045 8.94108V11.9512Z \“ / \ u003e \ u003cpath d = \“ M3.31675 6.59049C3.31675 5.28821 2.83866 4.66232 1.82471 4.66232C0.791758 4.66232 0.313354 5.28821 0.313354 6.59049V11.9512C0.313354 13.2535 0.791758 13.8962 1.82471 13.8962C2.85798 13.8962 3.3167513.2535 3.31675 11.9512V6.59049Z \“ / \ u003e \ u003cpath d = \” M1.87209 0.400291C0.843612 0.400291 0 1.1159 0 1.98861C0 2.87869 0.822846 3.57676 1.87209 3.57676C2.90056 3.57676 3.7234 2.87869 3.7234 1.98861C3.7234 1.1159 2.90056 0.4 0.400291Z \“ fill = \”#1BB76E \“ / \ u003e \ u003c / svg \ u003e \ u003c / a \ u003e”, contentPolicyHtml:“根據\ u003ca href = \“ https://stackoverflow.com/help/licensing \” \ u003ecc by-sa \ u003c / a \ u003e \ u003ca href = \“ https://stackoverflow.com獲得許可的用戶貢獻/ legal / content-policy \“ \ u003e(內容策略)\ u003c / a \ u003e”, allowUrls:是 }, onDemand:是的, dispatchSelector:“。discard-answer” ,immediatelyShowMarkdownHelp:true,enableSnippets:true }); } }); 感謝您為Stack Overflow提供答案! 請務必回答問題。提供詳細信息並分享您的研究! 但是要避免... 尋求幫助,澄清或回答其他答案。 根據意見發表聲明;用參考或個人經驗來備份它們。 要了解更多信息,請參見有關編寫出色答案的提示。 草稿已保存 草稿丟棄 註冊或登錄 StackExchange.ready(function(){ StackExchange.helpers.onClickDraftSave('#login-link'); }); 使用Google註冊 使用Facebook註冊 使用電子郵件和密碼註冊 提交 以訪客身份發布 名稱 電子郵件 必需,但從未顯示 StackExchange.ready( 函數(){ StackExchange.openid.initPostLogin('。new-post-login','https%3a%2f%2fstackoverflow.com%2fquestions%2f19425104%2fcan-i-mark-some-code-as-Optional-while-debugging-in visual-studio-2012%23new-answer”,“ question_page”); } ); 以訪客身份發布 名稱 電子郵件 必需,但從未顯示 發表您的答案 丟棄 點擊“發布答案”,即表示您同意我們的服務條款,隱私政策和Cookie政策 不是您要找的答案?瀏覽標記為debug visual-studio的其他問題,或者提出您自己的問題。